package com.zte.claa.inficombo.csa.app.service.rptparse;

import org.json.JSONObject;

import com.zte.claa.inficombo.csa.app.comm.csif.CSIFCommService;
import com.zte.claa.inficombo.csa.app.config.CSAConfigProps;
import com.zte.claa.inficombo.csa.app.model.redis.SysLog;
import com.zte.claa.inficombo.csa.app.service.redis.PublishDataBuilder;
import com.zte.claa.inficombo.csa.app.util.JsonUtils;
import com.zte.claa.inficombo.csa.app.util.XEuiUtils;

public class ParserCSForcedQuitData extends ParserDefault {
	private static final String MSG_TYPE = "forced_quit";
	
	public String getType() {
		return MSG_TYPE;
	}
	
	/**
	 * CS被动下线消息处理：
	 * 
	 * 下面两种情况MSP会向CS发送“CS被动下线消息”：
		（1）新的CS注册成功，MSP会向当前在线的CS发送“CS被动下线消息”，然后断开与当前CS之间的TCP链接。
		（2）MSP检测CS的心跳消息异常，会向CS发送“CS被动下线消息”，然后断开与当前CS之间的TCP链接。
	 */
	public void parseData(String jsonData, CSIFCommService svr) throws Exception {
		logger.warn("[*!!*]Receive cs force quit message: "+jsonData);
		if(svr == null){
			logger.warn("Relate CSIFCommService is null: "+jsonData);
			return;
		}
		// 发布appEUI断链消息。
		JSONObject json = new JSONObject(jsonData);
		String appEUI = JsonUtils.getJsonAttrVal(json, "appeui", null);
		if(appEUI == null){
			logger.warn("AppEUI is null!");
			return;
		}
		boolean isReAuth = true;
		CSAConfigProps csaConfProp = this.container.getCsaConfigProps();
		if(CSAConfigProps.REAUTH_NO.equalsIgnoreCase(csaConfProp.getReauthwhenforcequit().trim())){
			isReAuth = false;
		}
		appEUI = XEuiUtils.appendStartZero4xEUI(appEUI);
		SysLog log = PublishDataBuilder.buildSysLog("CSA被CSIF强制断链", 
				SysLog.OP_RET_FAIL, 
				"CSA适配代理模块", 
				"CSIF链路管理", 
				"关联AppEUI="+appEUI+", reAuth="+isReAuth);
		String jsonLog = JsonUtils.toJson(log);
		// 发布日志（通过redis广播日志，应用服务器记录到数据库日志表中。。。
		this.container.getLogPublisher().publishMessage(jsonLog);
		if(isReAuth == false){
			logger.warn("Not reAuth to CSIF when force quit: "+appEUI);
			svr.closeConnectToCSIF();
			return;
		}
		// CSA自动回复心跳，因此收到“强退”消息后，要么其他CS注册，要么链路断开。
		svr.connectToCSIF();
		svr.authToCSIF();
		logger.info("connect and join to CSIF ok: "+appEUI);
		log = PublishDataBuilder.buildSysLog("重新建立到CSIF的链路", 
				SysLog.OP_RET_OK, 
				"CSA适配代理模块", 
				"CSIF链路管理", 
				"关联AppEUI="+appEUI);
		jsonLog = JsonUtils.toJson(log);
		// 发布日志（通过redis广播日志，应用服务器记录到数据库日志表中。。。
		this.container.getLogPublisher().publishMessage(jsonLog);
	}
}
